<?php    
    # Autoload hakee luokkia class - kansiosta    
    spl_autoload_register(function($class) {
        $classPrefix    = "class";
        $subfolder      = "";
        $fileExt        = ".php";
        $filename       = dirname(__DIR__).
            DIRECTORY_SEPARATOR.
            "class".
            DIRECTORY_SEPARATOR;

        if (mb_substr($class,-7) == "Control") {
            $subfolder = "control".DIRECTORY_SEPARATOR;
        } else if (mb_substr($class,-5) == "Model") {
            $subfolder = "model".DIRECTORY_SEPARATOR;
        } else if (mb_substr($class,-9) == "Exception") {
            $subfolder = "exception".DIRECTORY_SEPARATOR;
        } else if (mb_substr($class,0,10) == "SharedPHP\\") {
            $class = mb_substr($class,10);
            $filename = dirname(__DIR__).
                DIRECTORY_SEPARATOR.
                "3party".
                DIRECTORY_SEPARATOR.
                "PHP".
                DIRECTORY_SEPARATOR.
                "SharedPHP-0.10.003".
                DIRECTORY_SEPARATOR;

            switch ($class) {                
                case "DB":
                    $subfolder = "dbConn";
                    break;
                
                case "TestSuite":
                    $subfolder = "testSuite";
                    break;
                
                case "UnitConverter":
                    $subfolder = "unitConverter";
                    break;
                
                default:
                    $filename = null;
            }
            
            $subfolder .= DIRECTORY_SEPARATOR;
        }
        
        if ($filename) {
            $filename .= $subfolder.$classPrefix.$class.$fileExt;
            if (file_exists($filename)) { # Luokka löytyy
                require($filename);
            }
        }
    });
    
    # Aseta aikavyöhyke
    date_default_timezone_set(config("API","timezone"));
    
    # Muodosta aliakset
    class_alias("SharedPHP\DB","DB");
    
    # Määritä tietokantayhteys
    DB::open("gymdb","mysqli",array(
        "host"      => config("db","host"),
        "username"  => config("db","username"),
        "passwd"    => config("db","passwd"),
        "database"  => config("db","database"),
        "charset"   => config("db","charset")
    ));
            
    /**
     * Funktio tekee sisäisen rajapintakutsun käyttäen shell_execiä.
     *
     * Tätä voidaan käyttää esim. testiskriptien yhteydessä kun www-palvelua
     * ei ole välttämätön pitää päällä.
     * 
     * @param   string  $class      Kutsuttava luokka
     * @param   string  $function   Kutsuttava funktio
     * @param   string  $sessionid  Sessionid (= kirjautuminen)
     * @param   array   $data       Lähtettävä data
     * @return  array
     */
    function _apiCall($class,$function,$sessionid = null,$data = array()) {
        $result = array(
            "code"           => 9999, # 9999 = API call failed!
            "reasonCode"     => null,
            "reasonKey"      => null,
            "keyDesc"        => null,
            "text"           => "API call failed!",
            "data"           => null
        );
        
        $class      = escapeshellarg($class);
        $function   = escapeshellarg($function);
        $datafile   = "";
        
        # PHP versio
        $php = "php";
        if (isset($_SERVER["_"])) {
            $php = $_SERVER["_"];
        }
        
        # Tiedostopolku rajapintaan
        $api = dirname(__DIR__).
            DIRECTORY_SEPARATOR.
            "index.php";
        
        # Sessioid
        if ($sessionid) {
            putenv("HTTP_X_SESSIONID=$sessionid");
        }
        
        # Data
        if (is_array($data) && !empty($data)) {
            $tmp = tempnam(sys_get_temp_dir(),"gymdb");
            file_put_contents($tmp,json_encode($data));
            $datafile = escapeshellarg($tmp);
        }
        
        $exec = shell_exec(trim("$php $api $class $function $datafile"));
        
        # Parsi vastaus
        if ($exec) {
            $result = json_decode($exec,true);
        }
        
        # Poista datatiedosto
        if (isset($tmp)) {
            unlink($tmp);
        }
        
        # Poista sessioid
        if ($sessionid) {
            putenv("HTTP_X_SESSIONID");
        }
        
        return $result;
    }
    
    /**
     * Funktio tutkii onko taulukossa haluttua saraketta ja palauttaa sen.
     *
     * Jos saraketta ei löydy palautetaan oletusarvo.
     *
     * @param   array   $arr        Taulukko
     * @param   mixed   $key        Sarakkeen nimi
     * @param   mixed   $default    Oletus (vapaaehtoinen, oletusarvo NULL)
     * @return  mixed
     */
    function arrGet($arr,$key,$default = null) {
        $result = $default;
        if (is_array($arr) && array_key_exists($key,$arr)) {
            $result = $arr[$key];
        }
        return $result;
    }
    
    /**
     * Lukee asetuksen konfiguraatiotiedostosta.
     *
     * @param   string  $section    Asetuksen lohko
     * @param   string  $name       Asetuksen nimi
     * @param   mixed   $default    Oletus jos asetusta ei löydy (oletusarvo NULL)
     * @return  mixed
     */
    function config($section,$name,$default = null) {
        static $data = array();
        
        # Hae data
        if (empty($data)) {
            $data = parse_ini_file(
                dirname(dirname(__DIR__)).DIRECTORY_SEPARATOR.".config",
                true
            );
            
            if (!$data) {
                $data = array();
            }
        }
        
        $result = $default;
        
        # Löytyykö asetus
        if (!empty($data) && array_key_exists($section,$data)) {
            if (is_array($data[$section]) && array_key_exists($name,$data[$section])) {
                $result = trim($data[$section][$name]);
            }
        }
        
        return $result;
    }